An enterprise computing environment typically includes a plurality of interconnected computing nodes, which can be physical and/or virtual nodes. Physical computing nodes, i.e., physical machines, can be clustered and/or distributed, that is, they can physically reside in a single location or be distributed in several locations, communicatively coupled to one another by a network, e.g., the Internet or a private network. Virtual computing nodes, on the other hand, represent physical machines, and many virtual nodes can typically be hosted by one physical machine. By virtualizing its computing environment, an enterprise can more efficiently manage its physical computing resources. In addition, an enterprise that owns physical machines can optimize its investment by “renting” its excess computing capacity to another enterprise which does not own physical machines.
While the virtualization of a computing environment offers numerous advantages, provisioning such an environment can present serious challenges. For instance, many enterprises require services and applications that rely on other services/applications, which, in a physical or virtual world, reside in different physical/virtual computing nodes, such as servers. Each node must be configured to support its service/application. For example, when a node hosts a web application, the node must be configured as an application server; and when a node hosts a database service, the node must be configured as a database server. Accordingly, depending on the hosted service/application, each node must be provisioned with specific parameters that support the hosted service/application.
Moreover, in most cases, the interconnectivity and dependencies between applications and services, and therefore, between different nodes, can be very complex. For example, when an application depends on a database service, the application server must be able to connect to and/or communicate with the database server. Accordingly, when provisioning such an environment, physical or virtual, each node that hosts a service that depends on another service must be configured with the correct connectivity information so that the node can communicate with the other node(s) hosting the other service.
Due to the variety of server specific configurations, and to the complexity of deployment topologies, provisioning and/or modifying such an environment, on demand or at runtime, is a very difficult and error prone task.